package cn.zyl.demo.common.crypto;

import cn.zyl.demo.common.enums.MsgEnum;
import cn.zyl.demo.common.exception.CryptoHandlerException;
import cn.zyl.demo.common.permanent.MsgProperties;
import cn.zyl.demo.common.tools.StringTool;

/**
 * CryptoHandler类说明:密码处理工具类
 *
 * @author wsz
 * @version v1.0
 * @date 2020-07-22
 */
public abstract class AbstractCryptoHandler {
    /**
     * 加密方法
     * @param input 输入字符
     * @param secretKey 秘钥
     * @return 密文
     * @throws CryptoHandlerException 加解密处理异常
     */
    protected abstract String encrypt(String input,String secretKey) throws CryptoHandlerException;
    /**
     * 解密方法
     * @param input 密文
     * @param secretKey 秘钥
     * @return 明文
     * @throws CryptoHandlerException 加解密处理异常
     */
    protected abstract String decrypt(String input,String secretKey) throws CryptoHandlerException;
    /**
     * 加密
     * @param inputStr 输入字符
     * @param secretKey 秘钥
     * @param strict 是否使用严格模式 默认不使用 严格模式下加解密异常直接抛出，非严格模式加密失败使用原字符串，解密失败
     * @return 密文
     */
    public String encrypt(Object inputStr,String secretKey,boolean strict){
        String input = String.valueOf(inputStr);
        try{
            CryptoHandlerException.isTrueThrow(StringTool.isEmpty(input), MsgProperties.get(MsgEnum.ERROR_CRYPTO_FAIL_EMPTY));
            return encrypt(input,secretKey);
        }catch (Exception e){
            CryptoHandlerException.isTrueThrow(strict, e);
        }
        return input;
    }
    /**
     * 解密
     * @param inputStr 密文
     * @param secretKey 秘钥
     * @param strict 是否使用严格模式 默认不使用 严格模式下加解密异常直接抛出，非严格模式加密失败使用原字符串，解密失败
     * @return 明文
     */
    public String decrypt(Object inputStr,String secretKey,boolean strict){
        String input = String.valueOf(inputStr);
        try{
            CryptoHandlerException.isTrueThrow(StringTool.isEmpty(input), MsgProperties.get(MsgEnum.ERROR_CRYPTO_FAIL_EMPTY));
            return decrypt(input,secretKey);
        }catch (Exception e){
            CryptoHandlerException.isTrueThrow(strict, e);
        }
        return input;
    }
}
